package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import vista.RegistrarProducto;
import vista.RegistrarProductoModeloTablaIng;

import modelo.Categoria;
import modelo.CategoriaDAO;
import modelo.Ingrediente;
import modelo.IngredienteDAO;
import modelo.Preparacion;
import modelo.PreparacionDAO;
import modelo.Producto;
import modelo.ProductoDAO;
import modelo.pk.PreparacionPK;

	public class ControladorRegistrarProducto implements ActionListener{

	private RegistrarProducto registrarProducto;
	private static List<Ingrediente> ingredientesPro;

	public ControladorRegistrarProducto() {
		super();
		this.registrarProducto = new RegistrarProducto();
		registrarProducto.addListener(this);
		this.registrarProducto.setLocationRelativeTo(null);
		this.registrarProducto.setVisible(true);
		ingredientesPro = new ArrayList<Ingrediente>();
		limpiarCampos();
		
	}	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Incluir")){
		incluir();
		}
		else if (e.getActionCommand().equals("AgregarIngrediente")){
			agregarIngrediente();
		}
		else if (e.getActionCommand().equals("QuitarIngrediente")){
			quitarIngredientes();
		}
		else if (e.getActionCommand().equals("Nuevo")){
			limpiarCampos();
		}
		else if(e.getActionCommand().equals("Salir")){
			registrarProducto.dispose();
		}
	}
	public void incluir(){
		try{
			ProductoDAO productoDAO = new ProductoDAO();
			Producto producto = productoDAO.getProductoPorNombre(registrarProducto.getTxtNombre());
			if (producto==null){
				producto = new Producto();
				String nombre = registrarProducto.getTxtNombre();
				CategoriaDAO categoriaDAO = new CategoriaDAO();
				Categoria categoria = categoriaDAO.getCategoriaPorNombre(registrarProducto.getCmbCategorias());
				float precio = new Float(registrarProducto.getTxtPrecio());
				producto.setNombre(nombre);
				producto.setCat(categoria);
				producto.setPrecio(precio);
				productoDAO.incluir(producto);
				producto = productoDAO.getProductoPorNombre(nombre);
				for (int i=0;i<ingredientesPro.size();i++){
					Ingrediente ingrediente = ingredientesPro.get(i);
					PreparacionPK preparacionPK = new PreparacionPK(producto, ingrediente);
					Preparacion preparacion = new Preparacion(preparacionPK, ingrediente.getCantidad());
					PreparacionDAO preparacionDAO = new PreparacionDAO();
					preparacionDAO.Incluir(preparacion);
				}
				limpiarCampos();
			}
			else registrarProducto.mostrarMensaje("Ya existe");
		}catch (Exception e){
			registrarProducto.mostrarMensaje("chequee los Campos");
		}
	}
	public String[] arreCategorias(){
		CategoriaDAO categoriaDAO = new CategoriaDAO();
		List<Categoria> categorias = categoriaDAO.consultar();
		int longitud= categoriaDAO.tamañoTabla();
		String []arreCategorias = new String[(longitud+1)];
		arreCategorias[0]="--";
		int j=1;
		for (int i=0;i<categorias.size();i++){
		Categoria categoria = categorias.get(i);
		if (categoria.getEstatus().equals("A")){
		arreCategorias[j]=categoria.getNombre();
		j++;
		}
		}
		return arreCategorias;
	}
	public String[] arreIngredientes(){
		IngredienteDAO ingredienteDAO= new IngredienteDAO();
		List<Ingrediente> ingredientes = ingredienteDAO.consultarIngredientes();
		int longitud = ingredienteDAO.tamañoTabla();
		String[] arreIngredientes = new String[(longitud+1)];
		arreIngredientes[0]="--";
		int j = 1;
		for (int i=0;i<ingredientes.size();i++){
			Ingrediente ingrediente = ingredientes.get(i);
			if (ingrediente.getEstatus().equals("A")){
				arreIngredientes[j]=ingrediente.getNombre();
				j++;
			}
		}
		return arreIngredientes;
	}
	public String[] arreProductos(){
		ProductoDAO productoDAO = new ProductoDAO();
		List<Producto> productos = productoDAO.consultarProductos();
		int longitud = productoDAO.tamañoTabla();
		String[] arreProductos = new String[(longitud+1)];
		arreProductos[0]="--";
		int j=1;
		for (int i=0;i<productos.size();i++){
			Producto producto = productos.get(i);
			if (producto.getEstatus().equals("A")){
				arreProductos[j]=producto.getNombre();
				j++;
			}
		}
		return arreProductos;
	}
	private void limpiarCampos() {
		registrarProducto.setTxtNombre("");
		registrarProducto.setTxtCantidadIngreProd("");
		registrarProducto.setTxtPrecio("");
		registrarProducto.setCmbCategorias(arreCategorias());	
		registrarProducto.setCmbIngredientes(arreIngredientes());
		registrarProducto.setComboProducto(arreProductos());
		ingredientesPro.clear();
		registrarProducto.setTablaIng(new RegistrarProductoModeloTablaIng(ingredientesPro));
	}
	public void agregarIngrediente(){
		try{
			if (!buscarEnListaIng(registrarProducto.getCmbIngredientes()))
				{
					float porcion = new Float(registrarProducto.getTxtCantidadIngreProd());
					IngredienteDAO ingredienteDAO = new IngredienteDAO();
					Ingrediente ingrediente = ingredienteDAO.buscarIngredientePorNombre(registrarProducto.getCmbIngredientes());
					ingrediente.setCantidad(porcion);
					ingredientesPro.add(ingrediente);
					registrarProducto.setTablaIng(new RegistrarProductoModeloTablaIng(ingredientesPro));
					registrarProducto.setTxtCantidadIngreProd("");
					registrarProducto.setCmbIngredientes(arreIngredientes());
				}
			else registrarProducto.mostrarMensaje("Ingrediente esta en la Lista");
		}catch (Exception e){
			registrarProducto.mostrarMensaje("Chequee Campos");
		}
	}
	private void quitarIngredientes() {
		try {
		int nro = (Integer.parseInt(registrarProducto.getNro())-1);
		
			if (nro<ingredientesPro.size()){
				ingredientesPro.remove(nro);
				registrarProducto.setTablaIng(new RegistrarProductoModeloTablaIng(ingredientesPro));
				registrarProducto.setNro("");
			}
			else registrarProducto.mostrarMensaje("Nro no esta lista");
		} catch(Exception e){
			registrarProducto.mostrarMensaje("Nro debe ser numerico");
		}
	}
	public boolean buscarEnListaIng(String nombre){
		boolean existe= false;
		for (int i=0;i<ingredientesPro.size();i++){
			Ingrediente ingrediente = ingredientesPro.get(i);
			if (ingrediente.getNombre().equals(nombre)){
				existe = true;
				i=ingredientesPro.size();
			}	
		}
		return existe;
	}
}
